﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Olympic_email_to_future.IDAL;
using Olympic_email_to_future.IBLL;
using Olympic_email_to_future.Module;
using Olympic_email_to_future.DALFactory;
using System.Timers;
using System.Net.Mail;
using System.Net;
using System.IO;
using System.Data.Linq;

namespace Olympic_email_to_future.BLL
{
    class MailBLL : IMailBLL
    {
        public static IDAL.IMailInfo dalFactory = Olympic_email_to_future.DALFactory.DataAccess.CreateEmailDAL();
        public static IAttachmentInfo dalAtt = DataAccess.CreateAttachmentDAL();



        /*******************************************************************
         * * 函数名称：mailSend
         * * 功    能：发送当前时间内应该发送的邮件（即发送邮件的时间==当前时间）
         * * 参    数：
         * * 返 回 值：
         * * 作    者：LHX
         * * 日    期：2013年5月28日
         * *******************************************************************/
        public void mailSend()
        {
            IList<Module.MailInfo> listmail = dalFactory.getMailByCurrentTime();

            //建立smptclient 对象
            SmtpClient client = new SmtpClient();
            client.Host = "smtp.163.com";//主机 地址
            client.Port = 25;//端口号

            foreach (Module.MailInfo mail in listmail)
            {
                //获取attachments
                IList<AttachmentInfo> attList = dalAtt.getAttachmentInfoByMailId(mail.mailId);

                MailAddress from = new MailAddress("olympic_future@163.com", "test", Encoding.UTF8);//发件人,第二个参数为显示的发件人昵称  
                MailAddress to = new MailAddress("hanxuzaihuiwen@qq.com");//收件人  
                client.DeliveryMethod = SmtpDeliveryMethod.Network; //以网络smtp方式发送  
                client.UseDefaultCredentials = false;
                client.Credentials = new NetworkCredential("olympic_future@163.com", "olympic");//发件方的用户名和密码
                MailMessage message = new MailMessage(from, to);
                message.Subject = mail.mailTitle;
                message.Body = mail.mailContent;
                message.BodyEncoding = Encoding.UTF8;
                message.SubjectEncoding = Encoding.UTF8;
                //添加attachment

                foreach (AttachmentInfo att in attList)
                {
                    Stream stream = new MemoryStream(att.attachmentEntity.ToArray());
                    message.Attachments.Add(new Attachment(stream, att.attachmentName));
                }

                client.Send(message);
                dalFactory.updateState(mail.mailId);//将状态改为已发送
            }
        }


        /*******************************************************************
        * * 函数名称：getMailInfoByMailAddress
        * * 功    能：按照发件地址返回邮件列表
        * * 参    数：string EmailAddress  收件人地址  如果没有
        * * 返 回 值：
        * * 作    者：LHX
        * * 日    期：2013年5月25日
        * *******************************************************************/
        public IList<MailInfo> dogetMailInfoByMailAddress(string EmailAddress)
        {

            return dalFactory.getMailInfoByMailAddress(EmailAddress);
        }




        /*******************************************************************
        * * 函数名称：doHaveMailByTime
        * * 功    能：是否当前有要发的邮件
        * * 参    数：
        * * 返 回 值：true为有，fals就没有
        * * 作    者：LHX
        * * 日    期：2013年5月30日
        * *******************************************************************/
        public bool doHaveMailByTime()
        {
            if (dalFactory.getMailByCurrentTime().Count == 0)
            {
                return false;
            }
            else return true;
        }



        /*******************************************************************
         * * 函数名称：dogetMailInfoByCurrentTime
         * * 功    能：返回当前时间应发的邮件列表
         * * 参    数：
         * * 返 回 值：IList<MailInfo>
         * * 作    者：LHX
         * * 日    期：2013年5月30日
         * *******************************************************************/
        public IList<MailInfo> dogetMailInfoByCurrentTime()
        {
            return dalFactory.getMailByCurrentTime();
        }





        /*******************************************************************
         * * 函数名称：getMailByPublic
         * * 功    能：返回公开邮件
         * * 参    数：
         * * 返 回 值：IList<MailInfo>
         * * 作    者：LHX
         * * 日    期：2013年6月2日
         * *******************************************************************/
        public IList<MailInfo> dogetMailInfoByPublic()
        {
            return dalFactory.getMailByPublic();
        }



        /*******************************************************************
         * * 函数名称：dogetMailInfoById
         * * 功    能：根据id返回mailinfo对象
         * * 参    数：int id
         * * 返 回 值：MailInfo
         * * 作    者：LHX
         * * 日    期：2013年6月3日
         * *******************************************************************/
        public MailInfo dogetMailInfoById(int id)
        {
            return dalFactory.getMailInfoByMailId(id);
        }



        /*******************************************************************
         * * 函数名称：doinsertMailInfo
         * * 功    能：插入邮件对象
         * * 参    数：MailInfo mailinfo
         * * 返 回 值：void
         * * 作    者：LHX
         * * 日    期：2013年5月27日
         * *******************************************************************/
        public int doinsertMailInfo(MailInfo mailinfo)
        {
            return dalFactory.insertMailInfo(mailinfo);
        }

        /*******************************************************************
        * * 函数名称：deleteMialInfoByEmaiId
        * * 功    能：删除邮件
        * * 参    数：int mailid  邮件id   
        * * 返 回 值：void
        * * 作    者：MDL
        * * 日    期：2013年5月27日
        * *******************************************************************/
        public void deleteMialInfoByEmaiId(int mailid)
        {
            dalFactory.deleteMialInfoByEmaiId(mailid);
        }

        /*******************************************************************
         * * 函数名称：updateState
         * * 功    能：更改邮件公开状态
         * * 参    数：
         * * 返 回 值：
         * * 作    者：MDL
         * * 日    期：2013年6月8日
         * *******************************************************************/
        public void updatePublic(int mailid)
        {
            dalFactory.updatePublic(mailid);
        }
    }
}
